【问题标题】:How to insert in to multiple tables via Hibernate如何通过 Hibernate 插入多个表
【发布时间】:2016-08-16 10:29:52
【问题描述】:

我需要在 Hibernate 中插入两个表 - 我有一个用户,每个用户所属的都是成员。因此,在创建新用户时,我需要在成员表中添加一个新条目。我通过创建一个映射到我的成员表的成员对象然后将其作为映射到用户表的用户对象中的字段来尝试此操作

@Entity
@Table(name = "USER")
public class User
{
    @Id
    @GeneratedValue
    @Column(name = "id")
    private int id;

    @Column(name = "username")
    private String username;

    @Column(name = "password")
    private String password;

    @Column(name = "fullName")
    private String fullName;

    //other fields ommited

    @OneToOne
    @JoinColumn(name = "id")
    private Member member;

我的会员pojo如下所示

@Entity
@Table(name = "MEMBER")
public class Member
{
    @Id
    @GeneratedValue
    @Column(name = "id")
    private int id;

    @Column(name = "sgpid")
    private int sgpid;

    @Column(name = "username")
    private String username;

尝试保存对象我做如下;

@Override
public boolean addUser(User user)
{
    if (user == null)
    {
        throw new IllegalArgumentException("Unable to add null user");
    }

    Session session = HibernateUtil.getSessionFactory().openSession();
    session.beginTransaction();
    session.save(user);
    session.getTransaction().commit();

    return true;
}

这给了我保存在我的用户表中的行,但条目没有插入到成员表中。我认为我的链接注释可能不正确,但我不太确定 - 请有人提供帮助。

谢谢

【问题讨论】:

  • @JoinColumn(name = "id") 表示用户和成员共享相同的 id。你确定你的专栏不应该像 "member_id" 吗?这样,每个用户都有一个指向其成员的 member_id。
  • 用户和会员通过两个 id 链接,但实际上我现在可能会将其更改为在用户名上链接

标签: java spring hibernate


【解决方案1】:

尝试设置@OneToOne注解的级联值:

@OneToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name = "id")
private Member member;

【讨论】:

  • 我意识到我正在尝试编写的数据库文档也已过时,并且实际上使用用户名在两个表之间进行链接 - 这是否只需要更改连接列使用用户名代替注释?
  • 如果我将其更改为用户名,那么我会收到以下错误org.hibernate.MappingException: Repeated column in mapping for entity: com.rest.dao.model.User column: username (should be mapped with insert="false" update="false")
【解决方案2】:

在您的用户类中,您应该将 joinColumn 更改为 member_id。

正如另一个答案中提到的要持久化相关实体,您需要将级联设置为持久化,我建议使用 cascade All 这将在所有操作中涉及相关实体检查文档 https://docs.oracle.com/cd/E19798-01/821-1841/bnbqm/index.html

@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "member_id")
private Member member;

【讨论】:

  • 外键需要用户名 - 每次我使用时都会收到以下错误org.hibernate.Mappi‌​ngException: Repeated column in mapping for entity: com.rest.dao.model.U‌​ser column: username (should be mapped with insert="false" update="false")
  • 我猜你正在使用用户名作为连接列,这将与用户实体的用户名重复,而不是使用默认值,即成员类“用户名”中的属性名称, 使用另一个名字 @JoinColumn(name="member_username",referencedColumnName="username")
  • 所以加入需要在成员用户名列而不是用户上进行?
  • 没有加入仍然像这样的用户实体 @OneToOne(cascade = CascadeType.ALL) @JoinColumn(name="me‌​mber_username",refere‌​ncedColumnName="usern‌​ame") private Member member ;
猜你喜欢
  • 1970-01-01
  • 2019-08-02
  • 2015-02-18
  • 2022-06-10
  • 2017-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-17
相关资源
最近更新 更多