2014-12-19 107 views
0
CREATE TABLE `Policy` (
`policyId` int(11) NOT NULL AUTO_INCREMENT, 
`policyName` varchar(30) NOT NULL, 
`roleId` int(11) NOT NULL, 
PRIMARY KEY (`policyId`) 
CONSTRAINT `policy_ibfk_1` FOREIGN KEY (`roleId`) REFERENCES `Role` (`roleId`) ON DELETE CASCADE 
)ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE `Role` (
`roleId` int(11) NOT NULL AUTO_INCREMENT, 
`rolename` varchar(30) NOT NULL, 
`roleDescription` varchar(100) DEFAULT NULL, 
PRIMARY KEY (`roleId`), 
) ENGINE=InnoDB AUTO_INCREMENT=39 DEFAULT CHARSET=utf8; 

我所描述的角色的策略表1-多映射和POJO如下休眠@OneToMany @ManyToOne插入多個表

@Entity 
@Table(name="policy") 
public class AWSPolicy implements Serializable{ 

@Id 
@GeneratedValue 
@Column(name = "policyId") 
private int policyId; 

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

@ManyToOne 
@JoinColumn(name="roleId") 
private Role role; 

public AWSRole getRole() { 
    return role; 
} 
public void setRole(Role role) { 
    this.role = role; 
} 

public int getPolicyId() { 
    return policyId; 
} 
public void setPolicyId(int policyId) { 
    this.policyId = policyId; 
} 

public String getPolicyName() { 
    return policyName; 
} 
public void setPolicyName(String policyName) { 
    this.policyName = policyName; 
} 

} 




@Entity 
@Table(name="role") 
public class Role implements Serializable{ 

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

@Id 
@GeneratedValue 
@Column(name = "roleId") 
private int roleId; 


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

@OneToMany(cascade=CascadeType.PERSIST, mappedBy = "role") 
private Set<AWSPolicy> policies; 

public Set<AWSPolicy> getPolicies() { 
    return policies; 
} 
public void setPolicies(Set<AWSPolicy> policyList) { 
    this.policies = policyList; 
} 

public int getRoleId() { 
    return roleId; 
} 
public void setRoleId(int roleId) { 
    this.roleId = roleId; 
} 

public String getRolename() { 
    return rolename; 
} 
public void setRolename(String rolename) { 
    this.rolename = rolename; 
} 

public String getRoleDescription() { 
    return roleDescription; 
} 
public void setRoleDescription(String roleDescription) { 
    this.roleDescription = roleDescription; 
} 
} 

的問題是,當我嘗試插入到表中,它只會插入到角色表中,而不是策略表。有人可以幫我弄這個嗎。

Role role = new Role(); 
    Set<Policy> policyList = new HashSet<Policy>(); 
    Policy policy = new Policy(); 
    policy.setPolicyName("uberpolicy"); 
    policyList.add(policy); 

    role.setRolename("uberrole"); 
    role.setRoleDescription("uberrole");  

    role.setPolicies(policyList); 

    Session session = getSessionFactory().getCurrentSession(); 
     session.save(role); 
+0

你能看到的SQL查詢休眠在調試模式下執行。 你檢查了嗎? – 2014-12-19 11:33:08

+0

啓用show_sql = true並粘貼執行的查詢。 – 2014-12-20 06:10:03

回答

0

下面是修復

@Entity 
@Table(name="cas_aws_role") 
public class AWSRole implements Serializable{ 

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

@Id 
@GeneratedValue 
@Column(name = "casAWSRoleId") 
private int casAWSRoleId; 

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


@OneToMany(cascade=CascadeType.ALL) 
@JoinColumn(name="casAWSRoleId") 
private Set<AWSPolicy> policies = new HashSet<AWSPolicy>(); 

// method to manage the bidirectional association 
public void addToPolicies(AWSPolicy awsPolicy) { 
    this.policies.add(awsPolicy); 
    awsPolicy.setAWSRole(this); 
} 

@ManyToOne 
@JoinColumn(name="casAWSRolesetId") 
private AWSRoleset awsRoleset; 

public AWSRoleset getAWSRoleset() { 
    return awsRoleset; 
} 
public void setAWSRoleset(AWSRoleset awsRoleset) { 
    this.awsRoleset = awsRoleset; 
} 


public Set<AWSPolicy> getPolicies() { 
    return policies; 
} 
public void setPolicies(Set<AWSPolicy> policyList) { 
    this.policies = policyList; 
} 

public int getCasAWSRoleId() { 
    return casAWSRoleId; 
} 
public void setCasAWSRoleId(int casAWSRoleId) { 
    this.casAWSRoleId = casAWSRoleId; 
} 

public String getCasAWSRolename() { 
    return casAWSRolename; 
} 
public void setCasAWSRolename(String casAWSRolename) { 
    this.casAWSRolename = casAWSRolename; 
} 


public String getCasAWSRoleDisplayName() { 
    return casAWSRoleDisplayName; 
} 
public void setCasAWSRoleDisplayName(String casAWSRoleDisplayName) { 
    this.casAWSRoleDisplayName = casAWSRoleDisplayName; 
} 

} 


@Entity 
@Table(name="cas_aws_policy") 
public class AWSPolicy implements Serializable{ 

@Id 
@GeneratedValue 
@Column(name = "casAWSPolicyId") 
private int casAWSPolicyId; 

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


@ManyToOne 
@JoinColumn(name="casAWSRoleId") 
private AWSRole awsRole; 

public AWSRole getAWSRole() { 
    return awsRole; 
} 
public void setAWSRole(AWSRole awsRole) { 
    this.awsRole = awsRole; 
} 


public int getCasAWSPolicyId() { 
    return casAWSPolicyId; 
} 
public void setCasAWSPolicyId(int casAWSPolicyId) { 
    this.casAWSPolicyId = casAWSPolicyId; 
} 

public String getCasAWSPolicyName() { 
    return casAWSPolicyName; 
} 
public void setCasAWSPolicyName(String casAWSPolicyName) { 
    this.casAWSPolicyName = casAWSPolicyName; 
} 

} 
0

可能這個例子會幫助你 http://www.mkyong.com/hibernate/hibernate-one-to-many-relationship-example-annotation/ http://viralpatel.net/blogs/hibernate-one-to-many-annotation-tutorial/ 能否請您刪除級聯= CascadeType.PERSIST和嘗試。

能否請您寫輸出您查詢,所以我可以幫你。

+0

我確實啓用了mysql日誌記錄。我看到了Hibernate查詢,但沒有被插入 休眠:(?)插入作用(roleDescription,角色名)值 休眠:(?)插入到政策(Role_roleID成爲,policyName)值 – outtoexplore 2014-12-19 17:33:10

0

我試過了你發佈的代碼。我看到在ROLE和POLICY表上執行插入查詢,但是POLICY表的roleId列中的值爲空。這是因爲您已經在策略實例中設置了角色對象。你必須設置關係的兩端。

下面的代碼應該更新外鍵值

Role role = new Role(); 
    Set<Policy> policyList = new HashSet<Policy>(); 
    Policy policy = new Policy(); 
    policy.setPolicyName("uberpolicy"); 

    policy.setRole(role);  //Set the role object in the policy through a setter. 

    policyList.add(policy); 

    role.setRolename("uberrole"); 
    role.setRoleDescription("uberrole");  

    role.setPolicies(policyList); 

    Session session = getSessionFactory().getCurrentSession(); 
    session.save(role);