2

在我的 JSF 里面我做了

<h:outputLabel value="Group:" for="group" />
<h:inputText id="group" value="#{newUserController.group.groupKey.groupId}" title="Group Id" />

Group.java

@Entity
public class Group {

    @EmbeddedId
    private GroupKey groupKey;

    @ManyToOne
    @JoinColumn(name="userId")
    private User user;
    //setter, getter, constructors, equals and hashes
}

GroupKey.java

@Embeddable
public class GroupKey {

    @Column(name="userId", insertable=false, updatable=false)
    private String userId;

    private String groupId;
    //setter, getter, constructors, equals and hashes
}

所以当我尝试持久化对象时,它给了我这个错误

value="#{newUserController.group.groupKey.groupId}": Target Unreachable, 'null' returned null

编辑
这是我的托管 Bean 的内容。

@ManagedBean(name="newUserController") 
@RequestScoped
public class NewUserController {

    private User user = new User();

    private Group group = new Group();    

    @EJB
    DocumentSBean sBean;

    public void createNewUser(){
        user.addGroup(group);
        sBean.persist(user);
    }
}
4

3 回答 3

2

要么#{newUserController.group}要么#{newUserController.group.groupKey}返回null。JSF 只会设置最后一个属性(groupId在这种情况下)。group如果这是一个模板实体,您需要为and/or提供/预设一个默认且非空值groupKey。例如,您可以在 bean 的(后)构造函数中执行此操作。如果这是一个现有实体,您需要确保这些属性已由 JPA 正确预填充。

于 2010-08-10T23:59:22.027 回答
2

我通过添加解决了它

 @PostConstruct
   public void init(){
     groupKey=new GroupKey();
 }

到 Group Class,它将被初始化并且它不会返回 null。

于 2012-04-09T02:43:58.203 回答
1

PostConstruct 对我不起作用(但我是新手,所以值得一试)。但是,将其添加到实体类构造函数中。

public Group() {
   this.groupKey=new GroupKey();
}
于 2013-12-19T14:42:24.297 回答