EntityNotFoundException - Spring mvc cant查询对象具有抽象类属性,但可以查询属性对象。并且仅限于某些遗产

问题描述 投票:0回答:1

我正在使用我的学院提供的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>
java mysql spring hibernate
1个回答
0
投票

看起来你的关系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 {

可能这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.