【问题标题】:Hibernate duplicating insert休眠复制插入
【发布时间】:2016-05-17 14:23:03
【问题描述】:

已解决

但真正的问题不是hibernate,主要是我和第二个Netbeans。

我正在发帖并保存我的数据。但是我在 js 中做了一个重复的帖子,而 Netbeans 不会两次触发断点(我真的不知道为什么)。所以,对我来说,它只是发表一篇文章和一篇插入文章。但是不,两个帖子和两个插入。

抱歉耽误您的时间:/


我是 Hibernate 的新手,所以我遇到了一些问题,也许这只是一个愚蠢的问题,我真的不知道。

我正在尝试使用 @ManyToOne 关系将对象插入数据库,但是当我持久化并提交事务时,Hibernate 会复制它。这是我的代码。

用户帖子类

@Entity
@Table(name = "USERPOST", schema = "ADMIN1")
public class UserPost implements java.io.Serializable {

    private int iduserpost;    
    private String detail;
    private User user;

    public UserPost() {
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "IDUSERPOST", unique = true, nullable = false)
    public int getIduserpost() {
        return this.iduserpost;
    }

    public void setIduserpost(int iduserpost) {
        this.iduserpost = iduserpost;
    }
    @Column(name = "DETAIL", nullable = false)
    public String getDetail() {
        return this.detail;
    }

    public void setDetail(String detail) {
        this.detail = detail;
    }

    @ManyToOne
    @JoinColumn(name = "IDUSER")
    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

用户类

@Entity
@Table(name = "USER", schema = "ADMIN1")
public class User implements java.io.Serializable {

    private int iduser;
    private String name;
    private String email;
    private Set<UserPost> posts;

    public User() {
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "IDUSER", unique = true, nullable = false)
    public int getIduser() {
        return this.iduser;
    }

    public void setIduser(int iduser) {
        this.iduser = iduser;
    }

    @Column(name = "NAME", nullable = false)
    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Column(name = "EMAIL", nullable = false)
    public String getEmail() {
        return this.email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @OneToMany(mappedBy = "user")
    public Set<UserPost> getPosts() {
        return posts;
    }

    public void setPosts(Set<UserPost> posts) {
        this.posts = posts;
    }

}

在管理器上插入方法

public void Insert(Object data) {
    Session session = null;
    try {
        session = hibernateUtil.getSessionFactory().openSession();
        session.beginTransaction();
        session.persist(data);
        session.getTransaction().commit();
    } catch (Exception e) {
        System.err.println(e.getMessage());
        throw e;
    } finally {
        if (session.isOpen()) {
            session.close();
        }
    }
}

在 Servlet 上插入

FeedManager manager = new FeedManager();
UserPost post = new UserPost();
post.setDetail(text);
User usrPesist = (User) manager.GetById(User.class, idUser);
post.setUser(usrPesist);
manager.Insert(post);

我得到的结果是两个用户帖子被插入到数据库中,而我想要的只是一个。

有什么问题吗?

【问题讨论】:

  • 请启用SQL logging 并发布日志中的相关摘录。

标签: java sql hibernate jsp persistence


【解决方案1】:

由于您在用户类中定义为private Set&lt;UserPost&gt; posts;, 在 UserPost 类中实现 equalshashcode 方法,这样你就可以确保因为它是一个 Set 它不会添加重复项

但这不是最佳方式。

【讨论】:

  • 那么我应该怎么做,以获得最佳方式?
  • 请分享更多日志以便更好地排除故障。
【解决方案2】:

我认为这是您的用户类中的 id 生成策略的问题。只需尝试在用户类对象中手动设置 id 即可。

【讨论】:

    【解决方案3】:

    尝试使用以下代码更改您的代码:

    @org.hibernate.annotations.Cascade( {org.hibernate.annotations.CascadeType.SAVE_UPDATE})
    @OneToMany(mappedBy = "user")
    @JoinColumn(name = "IDUSER")
    public Set<UserPost> getPosts() {
        return posts;
    }
    

    【讨论】:

    • 仍在复制:(
    猜你喜欢
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    相关资源
    最近更新 更多