我在Tapestry上遇到了tynamo模型模块(org.tynamo:tapestry-model-web:0.3.1:jar),并且遇到了我无法处理的问题。
我有两个实体Client和Contract。显然,一个客户有很多合同:
合同
@Entity
@BeanModels({ @BeanModel(reorder = "id") })
public class Contract {
[...]
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="contract_id")
public Long getId() {
return id;
}
/**
* @return the client
*/
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "client_id", nullable = true)
public Client getClient() {
return client;
}
客户
@Entity
@BeanModels({ @BeanModel(reorder = "id") })
public class Client{
[...]
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "client_id")
public Long getId() {
return id;
}
/**
* @return the contracts
*/
@OneToMany(cascade = { CascadeType.ALL })
public List<Contract> getContracts() {
return contracts;
}
如果我排除合同与我尝试创建一个新的客户端,一切正常
@BeanModels({ @BeanModel(exclude = "contrats") })
但是,如果我尝试添加一个不排除合同的合同,则会出现以下异常:
ERROR] pages.Add Render queue error in SetupRender[tynamo/PropertyEditBlocks:palette_set]: Failure reading parameter 'selected' of component tynamo/PropertyEditBlocks:palette_set: org.apache.tapestry5.ioc.internal.util.TapestryException
org.apache.tapestry5.ioc.internal.util.TapestryException: Failure reading parameter 'selected' of component tynamo/PropertyEditBlocks:palette_set: org.apache.tapestry5.ioc.internal.util.TapestryException [at classpath:org/tynamo/pages/PropertyEditBlocks.tml, line 39]
at org.apache.tapestry5.internal.structure.ComponentPageElementImpl$AbstractPhase.invoke(ComponentPageElementImpl.java:153)
at org.apache.tapestry5.internal.structure.ComponentPageElementImpl$SetupRenderPhase.render(ComponentPageElementImpl.java:181)
at org.apache.tapestry5.internal.services.RenderQueueImpl.run(RenderQueueImpl.java:72)
at org.apache.tapestry5.internal.services.PageRenderQueueImpl.render(PageRenderQueueImpl.java:124)
at $PageRenderQueue_419b37801cb0d.render(Unknown Source)
at $PageRenderQueue_419b37801cb0c.render(Unknown Source)
根据我对Palette组件的了解,这意味着应该显示的默认选定值...不是!确切的原因是没有默认值!
如果我直接在数据库(MySQL)中添加客户端,并且不从我的实体中排除此字段,则可以毫无问题地显示和编辑该客户端,但是添加新客户端时仍然会出现问题。
我错过了什么?
最佳答案
只要确保您的合同清单始终具有非空值即可。
@Entity
@BeanModels({ @BeanModel(reorder = "id") })
public class Client{
private List<Contract> contracts = new ArrayList<Contract>();
@OneToMany(cascade = { CascadeType.ALL })
public List<Contract> getContracts() {
return contracts;
}
[...]
}
顺便说一句,请注意客户与合同之间的双向关系。在这种情况下,我认为您正在尝试映射同一关系的两个方面,但是您正在映射两个不同的关系。双向关系总是棘手的,但这是另一个问题。