2011-04-10 66 views
0

我正在使用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

回答

8

你需要使用@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

0

我敢肯定你不能做到這一點。從某種意義上說,ORM是關於將一​​行映射到一個對象的。您可以做的最好的方法是使用SQL視圖來創建與此Bean相對應的只讀結構。這將允許您將數據查詢到您設計的結構中,但無法進行更新。

+1

+1 - 這樣做會鼓勵非規範化。 – corsiKa 2011-04-10 19:21:50

+0

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

0

,如果您需要它是在不同的表,這樣做

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

相關問題