2014-12-19 105 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);