我正在使用我的学院提供的Spring MVC - Hibernate - MySQL项目模板来完成一个项目。
该项目有一个抽象类Actor,6个类扩展了Actor:Administrator,Explorer,Manager,Ranger,Auditor和Sponsor。
另一方面,有消息,其具有发送者(Actor),收件人集合(Actor)和各种其他无关紧要的属性。
问题是我无法进行涉及从数据库中选择一个消息的操作,该消息具有不是Ranger的发送者或接收者。它在其他所有情况下都能正常工作。
我有一个名为QueryDatabase的实用程序,我可以在eclipse控制台上查询。在这一层,转换器无关紧要,因为它只是简单的查询,所以问题不在转换器上,因为即使在查询时我也遇到了这个问题。
我无法选择具有管理员发件人的邮件:
> select m from Message m where m.sender.id=342;
javax.persistence.EntityNotFoundException: Unable to find domain.Actor with id 342
但是,我可以选择该消息的发件人:
> select m.sender from Message m where m.sender.id=342;
1 object selected
domain.Administrator{id=342, version=0}
domain.DomainEntity::id: int = 342
domain.DomainEntity::version: int = 0
domain.Actor::name: java.lang.String = "Mark"
domain.Actor::surname: java.lang.String = "Kilo"
domain.Actor::email: java.lang.String = "[email protected]"
domain.Actor::phone: java.lang.String = "6662637633"
domain.Actor::address: java.lang.String = "Ulises Street,12,London"
domain.Actor::isSuspicious: boolean = false
domain.Actor::isBanned: boolean = false
domain.Actor::folders: java.util.Collection = [domain.Folder{id=343, version=0}, domain.Folder{id=344, version=0}, domain.Folder{id=345, version=0}, domain.Folder{id=346, version=0}, domain.Folder{id=347, version=0}, domain.Folder{id=348, version=0}]
domain.Actor::socialEntities: java.util.Collection = []
domain.Actor::userAccount: security.UserAccount = security.UserAccount{id=329, version=0}
我也可以通过它的id选择一个那个管理员的Actor:
> select a from Actor a where a.id=342;
1 object selected
domain.Administrator{id=342, version=0}
domain.DomainEntity::id: int = 342
domain.DomainEntity::version: int = 0
domain.Actor::name: java.lang.String = "Mark"
domain.Actor::surname: java.lang.String = "Kilo"
domain.Actor::email: java.lang.String = "[email protected]"
domain.Actor::phone: java.lang.String = "6662637633"
domain.Actor::address: java.lang.String = "Ulises Street,12,London"
domain.Actor::isSuspicious: boolean = false
domain.Actor::isBanned: boolean = false
domain.Actor::folders: java.util.Collection = [domain.Folder{id=343, version=0}, domain.Folder{id=344, version=0}, domain.Folder{id=345, version=0}, domain.Folder{id=346, version=0}, domain.Folder{id=347, version=0}, domain.Folder{id=348, version=0}]
domain.Actor::socialEntities: java.util.Collection = []
domain.Actor::userAccount: security.UserAccount = security.UserAccount{id=329, version=0}
并且,正如我所说,我可以选择一个消息,发件人/收件人是游侠:
> select m from Message m where m.sender.id=403;
11 objects selected
domain.Message{id=472, version=0}
domain.DomainEntity::id: int = 472
domain.DomainEntity::version: int = 0
domain.Message::LOW: java.lang.String = "LOW"
domain.Message::NEUTRAL: java.lang.String = "NEUTRAL"
domain.Message::HIGH: java.lang.String = "HIGH"
domain.Message::subject: java.lang.String = "House Fix"
domain.Message::body: java.lang.String = "We have to fix the widnow in the liing room"
domain.Message::moment: java.util.Date = <<2016-07-12 00:00:00.0>>
domain.Message::priority: java.lang.String = "HIGH"
domain.Message::sender: domain.Actor = domain.Ranger{id=403, version=0}
domain.Message::recipients: java.util.Collection = [domain.Ranger{id=409, version=0}]
etc
但是,我可以查询具有“管理员”或“资源管理器”类型属性的实体以及该具体类型的即时属性。
所以,问题是当我查询具有Actor(抽象)属性的实体,并且实例化属性是不是Ranger的扩展Actor类时。
我被告知要放的所有标签和扩展在所有类中都是相同的,所以,任何关于它可能出错的想法?
域和存储库文件中的所有标记和导入的库都是相同的,并且它们都扩展了actor。
游骑兵既不是第一个实例化也不是最后一个类。
我找不到Rangers的任何不同之处,因为它让它们起作用。
如果您需要任何其他代码,请告诉我,但我甚至不知道什么是有用的,因为一切似乎都是多余的。
谢谢阅读。
编辑:忘了说,这不会发生在消息上。它也发生在SocialEntity,它具有类似的属性。
EDIT2:要添加实体的代码以防有人注意到任何奇怪的事情:
信息:
@Entity
@Access(AccessType.PROPERTY)
public class Message extends DomainEntity {
// Priority Values -----------------------------------------------------------------
public static final String LOW = "LOW";
public static final String NEUTRAL = "NEUTRAL";
public static final String HIGH = "HIGH";
private String subject;
private String body;
private Date moment;
private String priority;
private Actor sender;
private Collection<Actor> recipients;
@NotBlank
public String getSubject() {
return this.subject;
}
public void setSubject(final String subject) {
this.subject = subject;
}
@NotBlank
public String getBody() {
return this.body;
}
public void setBody(final String body) {
this.body = body;
}
@DateTimeFormat(pattern = "dd.MM.yyyy HH:mm:ss.SSSZ")
@Temporal(TemporalType.TIMESTAMP)
public Date getMoment() {
return this.moment;
}
public void setMoment(final Date moment) {
this.moment = moment;
}
@NotBlank
@Pattern(regexp = "^" + LOW + "|" + NEUTRAL + "|" + HIGH + "$")
public String getPriority() {
return this.priority;
}
public void setPriority(final String priority) {
this.priority = priority;
}
@NotNull
@Valid
@ManyToOne(optional = false)
public Actor getSender() {
return this.sender;
}
public void setSender(final Actor sender) {
this.sender = sender;
}
@NotEmpty
@Valid
@ManyToMany
public Collection<Actor> getRecipients() {
return this.recipients;
}
public void setRecipients(final Collection<Actor> recipients) {
this.recipients = recipients;
}
}
演员:
@Entity
@Access(AccessType.PROPERTY)
public class Actor extends DomainEntity {
private String name;
private String surname;
private String email;
private String phone;
private String address;
private boolean isSuspicious;
private boolean isBanned;
private Collection<Folder> folders;
private Collection<SocialEntity> socialEntities;
private UserAccount userAccount;
@NotBlank
public String getName() {
return this.name;
}
public void setName(final String name) {
this.name = name;
}
@NotBlank
public String getSurname() {
return this.surname;
}
public void setSurname(final String surname) {
this.surname = surname;
}
@Email
public String getEmail() {
return this.email;
}
public void setEmail(final String email) {
this.email = email;
}
public String getPhone() {
return this.phone;
}
public void setPhone(final String phone) {
this.phone = phone;
}
public String getAddress() {
return this.address;
}
public void setAddress(final String address) {
this.address = address;
}
@OneToMany(cascade = CascadeType.ALL)
@NotNull
@Valid
public Collection<Folder> getFolders() {
return this.folders;
}
public void setFolders(final Collection<Folder> folders) {
this.folders = folders;
}
@ElementCollection
@OneToMany(mappedBy = "actor")
@NotNull
public Collection<SocialEntity> getSocialEntities() {
return this.socialEntities;
}
public void setSocialEntities(final Collection<SocialEntity> socialEntities) {
this.socialEntities = socialEntities;
}
@OneToOne(cascade = CascadeType.ALL)
@NotNull
public UserAccount getUserAccount() {
return this.userAccount;
}
public void setUserAccount(final UserAccount userAccount) {
this.userAccount = userAccount;
}
public boolean getIsSuspicious() {
return isSuspicious;
}
public void setIsSuspicious(boolean isSuspicious) {
this.isSuspicious = isSuspicious;
}
public boolean getIsBanned() {
return isBanned;
}
public void setIsBanned(boolean isBanned) {
this.isBanned = isBanned;
}
游侠:
@Entity
@Access(AccessType.PROPERTY)
public class Ranger extends Actor {
private Curricula curricula;
private Collection<Trip> trips;
@NotNull
@OneToOne(optional = true, cascade = CascadeType.ALL)
public Curricula getCurricula() {
return this.curricula;
}
@Valid
@OneToMany(mappedBy = "ranger")
public Collection<Trip> getTrips() {
return this.trips;
}
public void setCurricula(final Curricula curricula) {
this.curricula = curricula;
}
public void setTrips(final Collection<Trip> trips) {
this.trips = trips;
}
例如,管理员。如果您需要更多,请告诉我:
@Entity
@Access(AccessType.PROPERTY)
public class Administrator extends Actor{
}
EDIT3:为演员填充bean的示例;
管理员:
<bean id="admin1" class="domain.Administrator">
<property name="name" value="Mark" />
<property name="surname" value="Kilo" />
<property name="email" value="[email protected]" />
<property name="phone" value="6662637633" />
<property name="address" value="Ulises Street,12,London" />
<property name="folders">
<list>
<ref bean="sys-admin1"/>
<ref bean="inbox-admin1" />
<ref bean="outbox-admin1" />
<ref bean="notifbox-admin1" />
<ref bean="trashbox-admin1" />
<ref bean="spambox-admin1" />
</list>
</property>
<property name="socialEntities">
<list>
</list>
</property>
<property name="userAccount" ref="adminUserAccount" />
<property name="isSuspicious" value="false" />
<property name="isBanned" value="false" />
</bean>
游侠:
<bean id="ranger1" class="domain.Ranger">
<property name="name" value="Paco" />
<property name="surname" value="Pepe" />
<property name="email" value="[email protected]" />
<property name="phone" value="953547272" />
<property name="address" value="C\ Alpha nº69" />
<property name="userAccount" ref="rangerUserAccount" />
<property name="isSuspicious" value="false" />
<property name="isBanned" value="false" />
<property name="folders">
<list>
<ref bean="inbox-ranger1" />
<ref bean="outbox-ranger1" />
<ref bean="notifbox-ranger1" />
<ref bean="trashbox-ranger1" />
<ref bean="spambox-ranger1" />
</list>
</property>
<property name="socialEntities">
<list>
<ref bean="socialEntity3" />
<ref bean="socialEntity4" />
</list>
</property>
<property name="curricula" ref="curricula1">
</property>
<property name="trips">
<list>
<ref bean="trip1" />
</list>
</property>
</bean>
看起来你的关系Message.sender - > Actor是通过中间表message_senders或类似的东西制作的:
table actors <- table actors_senders(actor_id, sender_id) -> table senders
并且在表actors_senders中删除了记录,其中actor_id = 342。
在我看到你的实体的代码之前,我可以说这一切。
编辑:
添加实体代码之后:你有抽象类Actor,它既不是抽象的,也不是Java,也不是Hibernate。这非常令人困惑(包括Hibernate)。
以下一种方式更改您的类Actor:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Actor extends DomainEntity {
可能这会有所帮助。