Java Hibernate中的多对多关系和额外列

Java Hibernate中的多对多关系和额外列,java,spring,hibernate,Java,Spring,Hibernate,我有这样的数据库结构。它用于我的应用程序中的用户访问控制 UserGroup ========== id (PK) code name HakAkses ========== id(PK) UserGroup_id (FK) Akses_id (FK) action_create action_read action_update action_delete Akses ========== id(PK) code 我这样做hibernate注释

我有这样的数据库结构。它用于我的应用程序中的用户访问控制

 UserGroup
 ==========
 id (PK)
 code
 name


 HakAkses
 ==========
 id(PK)
 UserGroup_id (FK)
 Akses_id (FK) 
 action_create
 action_read
 action_update
 action_delete


 Akses
 ==========
 id(PK)
 code
我这样做hibernate注释

@Entity
@Table(name = "[Master].[UserGroup]")
public class UserGroup implements Serializable{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(unique = true, length = 10)
    private String kode;
    private String nama;

    @OneToMany(mappedBy = "userGroup")
    private Set<HakAkses> hakAksesSet;
}

@Entity
@Table(name = "[master].[HakAkses]")
public class HakAkses implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "UserGroup_id", nullable = false)
    private UserGroup userGroup;

    @ManyToOne
    @JoinColumn(name = "Akses_id", nullable = false)
    private Akses akses;

    @Column(name = "action_create")
    private boolean canCreate;
    @Column(name = "action_read")
    private boolean canRead;
    @Column(name = "action_update")
    private boolean canUpdate;
    @Column(name = "action_delete")
    private boolean canDelete;
}

@Entity
@Table(name = "[master].[Akses]")
public class Akses implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(unique = true)
    private String kode;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "akses")
    private List<HakAkses> hakAksesSet;
}
@实体
@表(name=“[Master].[UserGroup]”)
公共类UserGroup实现了可序列化{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私人长id;
@列(唯一=真,长度=10)
私人字符串科德;
私有字符串nama;
@OneToMany(mappedBy=“用户组”)
私有集hakakseset;
}
@实体
@表(name=“[master].[HakAkses]”)
公共类HakAkses实现了可序列化{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私人长id;
@许多酮
@JoinColumn(name=“UserGroup\u id”,null=false)
私有用户组用户组;
@许多酮
@JoinColumn(name=“Akses_id”,null=false)
私人阿克塞阿克塞;
@列(name=“action\u create”)
私有布尔canCreate;
@列(name=“action\u read”)
私有布尔可读;
@列(name=“action\u update”)
私有布尔更新;
@列(name=“action\u delete”)
私有布尔烛台;
}
@实体
@表(name=“[master].[Akses]”)
公共类Akses实现可序列化{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私人长id;
@列(唯一=真)
私人字符串科德;
@OneToMany(fetch=FetchType.LAZY,mappedBy=“akses”)
私人名单;
}
然后我用这个代码在我的测试仪中进行了测试

UserGroup userGroup = new UserGroup(kode, nama);
userGroup.setHakAksesSet(new HashSet<HakAkses>(hakAksesList));
this.controller.save(userGroup);
UserGroup UserGroup=新用户组(kode,nama);
sethakakset(新HashSet(hakakslist));
this.controller.save(用户组);
但是,当我运行测试仪时,数据保存在仅数据库用户组数据中。 我的hibernate注释有问题吗


谢谢

这是因为父实体上缺少级联注释。看看这是否有帮助

@Table(name = "[Master].[UserGroup]")
public class UserGroup implements Serializable{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(unique = true, length = 10)
    private String kode;
    private String nama;

    @OneToMany(mappedBy = "userGroup", cascade = CascadeType.ALL)
    private Set<HakAkses> hakAksesSet;
}
@Table(name=“[Master].[UserGroup]”)
公共类UserGroup实现了可序列化{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私人长id;
@列(唯一=真,长度=10)
私人字符串科德;
私有字符串nama;
@OneToMany(mappedBy=“userGroup”,cascade=CascadeType.ALL)
私有集hakakseset;
}

您的映射使用
mappedBy
,在其他设置中,它会将
inverse=“true”
设置注入到一对多端。请在此处阅读更多信息:

  • mkyong
简言之,这意味着冬眠是被指示的:另一端(多对一)将关心持久化。另外,请尝试在文档中查看此示例

本例显示了反作用,一些基本引用:

。。。既然子实体正在管理链接的状态,我们就告诉集合不要更新链接。我们使用反转属性来执行此操作:

现在只会发出一个SQL插入。

那么我们在那里看到了什么

  • 反向设置是我们需要的。它提高了性能(这归功于mappedBy)
  • 但仅在
    一对多
    一侧设置关系是不够的。我们必须为每个孩子设置一个家长
因此,您应该扩展此功能:

UserGroup userGroup = new UserGroup(kode, nama);
userGroup.setHakAksesSet(new HashSet<HakAkses>(hakAksesList));
// this is not enough - we also MUST 
// FOR each HakAkses in the  list 
// SET a Parent, i.e hakAksses.setUserGroup(userGroup)

非常感谢。你的回答帮助我解决了这个问题。很高兴看到这一点,先生:)享受神奇的冬眠:)
Parent p = (Parent) session.load(Parent.class, pid);
Child c = new Child();
c.setParent(p);
p.getChildren().add(c);
session.save(c);
session.flush();
UserGroup userGroup = new UserGroup(kode, nama);
userGroup.setHakAksesSet(new HashSet<HakAkses>(hakAksesList));
// this is not enough - we also MUST 
// FOR each HakAkses in the  list 
// SET a Parent, i.e hakAksses.setUserGroup(userGroup)
@OneToMany(mappedBy = "userGroup", cascade = CascadeType.ALL)