【问题标题】:how to prevent hibernate to insert into one table in many to many mapping如何防止休眠在多对多映射中插入到一个表中
【发布时间】:2013-10-04 18:55:20
【问题描述】:

我正在创建用户个人资料,用户可以在其中输入他们的兴趣,其中兴趣是预定义的列表,用户无法从此列表中选择。

我有主键 userIdinterestId 的用户和兴趣表。

             Table:User
-------------------------------------
        userId      userName
          1            aaaa
          2            bbbb
          3            cccc

           Table:Intrest
-------------------------------------
      interestId    interestName
          1            Sports
          2            Reading
          3            Music

多对多映射表

         Table:UserIntrest
-------------------------------------
        userId    interestId
          1            1
          1            2
          1            3

这是我的代码

User.java

@Entity
public class User {
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO)
    private long userId;
    private String username;
    private String password;

    @ManyToMany(cascade=CascadeType.ALL)
    @JoinTable(
        name="UserIntrest",
        joinColumns={ @JoinColumn(name="userId",referencedColumnName="userId") },
        inverseJoinColumns={ @JoinColumn(name="intrestId", referencedColumnName="intrestId") }
        )
    private List<Intrest> intrestList;

    ----- Getters Setters -----

Intrest.java

@Entity
@Table(name="intrest")
public class Intrest {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int intrestId;
    private String intrestName;

    public Intrest(String name){
        this.intrestName = name;
    }
----- Getters & Setters -----

ActionClass.java

public class ActionClass extends ActionSupport {


    private User user;
    private List<String> intrestList;//for get list of intrest from jsp select tag
    private List<Intrest> intrestLst = new ArrayList<Intrest>();

    public String execute(){
        for(int i = 0;i<intrestList.size();i++){
            System.out.print(intrestLst.add(new Intrest(intrestList.get(i))));
        }
        user.setIntrestList(intrestLst);

        SessionFactory sf = new Configuration().configure().buildSessionFactory();
        Session session = sf.getCurrentSession();
        session.beginTransaction();
        session.save(user);
        session.getTransaction().commit();


        return SUCCESS;
    }

    ----- Getters & Setters -----

所以当我运行它时,它会在用户表中插入用户,在兴趣表中选择兴趣并在用户兴趣表中映射

一切正常,但我不需要在兴趣表中插入兴趣,因为我已经插入了所需的兴趣。

Hibernate: insert into User (password, username) values (?, ?)
Hibernate: insert into intrest (intrestName) values (?)
Hibernate: insert into intrest (intrestName) values (?)
Hibernate: insert into intrest (intrestName) values (?)
Hibernate: insert into intrest (intrestName) values (?)
Hibernate: insert into UserIntrest (userId, intrestId) values (?, ?)
Hibernate: insert into UserIntrest (userId, intrestId) values (?, ?)
Hibernate: insert into UserIntrest (userId, intrestId) values (?, ?)
Hibernate: insert into UserIntrest (userId, intrestId) values (?, ?)

我不想执行

Hibernate: insert into intrest (intrestName) values (?)
Hibernate: insert into intrest (intrestName) values (?)
Hibernate: insert into intrest (intrestName) values (?)
Hibernate: insert into intrest (intrestName) values (?)

查询。

我搜索了很多这个问题,但我找不到任何解决方案。

【问题讨论】:

  • 那你为什么用cascade=CascadeType.ALL
  • @AleksandrM 没有cascade=CascadeType.ALL 当我点击提交按钮时它抛出错误:org.hibernate.TransientObjectException:HTTP Status 500 - object references an unsaved transient instance - save the transient instance before flushing: model.Intrest

标签: java hibernate jpa hibernate-mapping


【解决方案1】:

问题不在于休眠,而在于您的代码..如果您正在执行new Interest(..),休眠会将它们保存在数据库中,您应该执行以下操作:

public class MyAction extends ActionSupport {
    private Long[] interestIds;

    public String execute() {

        // get interests with ids
        // set interests to user
        // save user

    }

}

【讨论】:

    【解决方案2】:

    首先,你必须确保你有兴趣ID的Getter和Setter,如果你错过了“IDE不显示警告”,你必须添加它们。

    那么你必须这样做

    @Entity
    class user{
    @ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE})
    @JoinTable(name="user_interest",joinColumns= {@JoinColumn(name="user_id", referencedColumnName = "id")},inverseJoinColumns= {@JoinColumn(name="interest_id", referencedColumnName = "id")})
    private Set<Interest> interests= new HashSet<>();
     .
     .
     }
    @Entity
    @JsonIgnoreProperties({"users"})
    class interest{
    @ManyToMany(mappedBy="interests")
    private List<User> users;
    }
    

    【讨论】:

    • 他在兴趣和用户的代码块末尾添加了----- Getters &amp; Setters -----...
    • @geisterfurz007 我遇到了同样的问题,IDE 没有在 Id 字段上显示警告,因为他使用了“@GeneratedValue(strategy=GenerationType.AUTO)”。 2天后我解决了问题!只是我添加了 Id getter 和 setter
    猜你喜欢
    • 2017-02-12
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2013-12-02
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多