Hibernate可以用一个bean更新两个表吗?

问题描述:

我正在使用Hibernate和Spring开发一个项目;一个屏幕,一个bean,但两个表。我想知道Hibernate是否可以在一次调用中更新两个 MySQL表格?Hibernate可以用一个bean更新两个表吗?

如果是这样,我该如何编码下面的bean(模型)来更新两个表!

用户名和密码在用户表中。 用户名和已启用位于权限表中。

下面是我的代码:

@Entity 
@Table(name = "users") 
public class User { 
    @Id 
    @GeneratedValue 
    @Column(name = "userid") 
    private Long userId; // in user and rights tables! 

    @NotEmpty(message = "User name must not be blank.") 
    @Size(max = 20) 
    @Column(name = "username", nullable = false, length = 20) 
    private String username; // in user table 

    @NotEmpty(message = "Password must not be blank.") 
    @Size(max = 20) 
    @Column(name = "password", nullable = false) 
    private String password; // in user table 

    @Column(name = "enabled") 
    private Long enabled; // in rights table 
} 
+0

为什么权限位于不同的表中,如果它们属于用户? – 2011-04-10 19:18:32

+0

可能的[Hibernate-Spring;一个屏幕,一个豆,但两个表](http://stackoverflow.com/questions/5588546/hibernate-spring-one-screen-one-bean-but-two-tables) – axtavt 2011-04-10 19:22:00

你需要使用@SecondaryTable注释,并在适当的@Column批注指定表名:

@Entity 
@Table(name="users") 
@SecondaryTable(name="rights", pkJoinColumns= 
    @PrimaryKeyJoinColumn(name="userid", referencedColumnName="userid") 
) 
public class User { 

... 

@Column(name = "enabled", table="rights") 
private Long enabled; // in rights table 
+0

感谢您的信息,我可以问问你在哪里找到这个?我一直在寻找天......谢谢 – SJS 2011-04-10 21:20:01

+0

@Stuttering - 它在Hibernate Annotations手册(上面的答案中有一个链接);它也在Hibernate Core手册(http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/mapping.html#d0e6906)第5.1.6.5章节中,尽管它被相当混淆地放在“继承“部分在那里。 – ChssPly76 2011-04-10 22:20:24

+2

或者如果您使用两个以上的表格,我们可能会多次为同一个实体使用@SecondaryTables注释(+1) – 2011-04-11 04:42:00

我敢肯定你不能做到这一点。从某种意义上说,ORM是关于将一​​行映射到一个对象的。您可以做的最好的方法是使用SQL视图来创建与此Bean相对应的只读结构。这将允许您将数据查询到您设计的结构中,但无法进行更新。

+1

+1 - 这样做会鼓励非规范化。 – corsiKa 2011-04-10 19:21:50

+0

-1 - 你可以非常做这 – ChssPly76 2011-04-10 19:29:04

,如果您需要它是在不同的表,这样做

class User { 
    Long userid; 
    String username; // why both a userid and a username? 
    String password; 
    Rights rights; 
} 

class Rights { 
    boolean enabled; 
    boolean canModerate; 
    int maxSomething; 
    // other rights here 
} 
+0

我看不到这个代码是如何显示我的人 – SJS 2011-04-10 21:20:33

+0

您必须自己添加注释,但是这个想法是,不是让一个类中的成员在不同的表中引用,代码清晰度会更好地为您的权限设置一个单独的类。如果你的权利很简单,你甚至不需要把你的用户名和他们联系起来。 – corsiKa 2011-04-10 21:58:41