我发现从Hibernate中的集合中删除时不会删除孤立记录.我必须做一些简单的错误,(这是Hibernate-101!),但我找不到它..
鉴于以下内容:
public class Book {
@ManyToOne
@NotNull
Author author;
}
public class Author
{
@OneToMany(cascade={CascadeType.ALL})
List<Book> books;
}
Run Code Online (Sandbox Code Playgroud)
以下更新代码:
Author author = authorDAO.get(1);
Book book = author.getBooks().get(0);
author.getBooks().remove(0);
authorDAO.update(author);
Run Code Online (Sandbox Code Playgroud)
AuthorDAO片段:
@Override
public void update(T entity) {
getSession().update(entity);
}
Run Code Online (Sandbox Code Playgroud)
以下测试失败:
Author author = author.get(1);
assertEquals(0,author.getBooks().size()); // Passes
Book dbBook = bookDAO.get(book.getId())
assertNull(dbBook); // Fail! dbBook still exists!
assertFalse(author.getBooks().contains(dbBook) // Passes!
Run Code Online (Sandbox Code Playgroud)
总之,我发现:
book.getAuthor().getBooks()
,那个集合中不存在书这种"感觉"就像我没有冲洗会话或强制更新 - 但我不确定我应该在哪里做这件事.沿着这条路线,其他可能影响的点:
@RunWith(SpringJUnit4ClassRunner.class)
@Transactional
,但是,我已经在一个普通的旧JUnit测试中重新创建了它.任何建议将不胜感激!
编辑: 感谢您的所有反馈.下面的评论,我已经添加@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
到父母,所以它现在:
public class …
Run Code Online (Sandbox Code Playgroud) 以一对多关系(国家/地区->
)为例.
国家(反面):
@OneToMany(mappedBy = "country", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
private List<StateTable> stateTableList=new ArrayList<StateTable>(0);
Run Code Online (Sandbox Code Playgroud)
StateTable(拥有方):
@JoinColumn(name = "country_id", referencedColumnName = "country_id")
@ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.DETACH})
private Country country;
Run Code Online (Sandbox Code Playgroud)
尝试更新StateTable
活动数据库事务(JTA或资源本地)中的提供(分离)实体的方法:
public StateTable update(StateTable stateTable) {
// Getting the original state entity from the database.
StateTable oldState = entityManager.find(StateTable.class, stateTable.getStateId());
// Get hold of the original country (with countryId = 67, for example).
Country oldCountry = oldState.getCountry();
// Getting …
Run Code Online (Sandbox Code Playgroud) 我对JPA 2.0,Hibernate和"orphanRemoval"有疑问.
首先我的设置:
我有两个相当简单的实体类,"User"和"AvatarImage","User"有一个"AvatarImage",所以在"User"和"AvatarImage"之间有关系.
在"用户"类中,属性如下所示:
// class "User"
@OneToOne(cascade = CascadeType.ALL, fetch=FetchType.LAZY, orphanRemoval = true)
private AvatarImage avatarImage;
Run Code Online (Sandbox Code Playgroud)
这意味着,如果"avatarImage"属性设置为null,则"User"和"AvatarImage"之间的引用将被删除,"orphanRemoval"机制将从数据库中删除"avatarImage"(如果我错了,请更正我).
因此,当我为某个用户更新"avatarImage"时,我目前必须写这个:
user.setAvatarImage( null ); // First set it to null
userRepository.save( user ); // Now "orphanRemoval" will delete the old one
user.setAvatarImage( theNewAvatarImage );
userRepository.save( user );
Run Code Online (Sandbox Code Playgroud)
因此,首先将"avatarImage"属性设置为null,保存"user",然后设置新的AvatarImage"theNewAvatarImage",再次保存用户.
这是它目前适用于我的唯一方式 - "orphanRemoval"将删除旧的"avatarImage",将其设置为"null",然后保存用户.
但是,我会认为这段代码也应该有效:
user.setAvatarImage( theNewAvatarImage );
userRepository.save( user );
Run Code Online (Sandbox Code Playgroud)
所以我省略将"avatarImage"设置为"null",只是设置"theNewAvatarImage",替换旧的"avatarImage".但这不起作用,旧的AvatarImage在事务提交时不会从数据库中删除.
有谁知道,为什么第二个代码(只是替换AvatarImage而不将其设置为"null"之前)不起作用?
我非常感谢您提供的任何帮助
非常感谢!
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Table(name = "company_policies")
@DiscriminatorColumn(name = "rule_name")
public abstract class AbstractPolicyRule implements Serializable {
@Transient
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private Long id;
private String value;
...
}
Run Code Online (Sandbox Code Playgroud)
_
@Entity
public class Category implements Serializable {
@Transient
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private Long id;
@Column(name = "category_name")
private String name;
@OneToMany(fetch = FetchType.EAGER, cascade = { CascadeType.ALL }, orphanRemoval = true)
@JoinColumn(name = "category_policy_id", referencedColumnName = "id")
private …
Run Code Online (Sandbox Code Playgroud) 我很想知道你是否可以,如果将提交合并到我的孤儿分支中是否有任何问题.对于此特定实例,我的Salesforce存储库具有主分支和预发布分支,但由于我们的沙箱环境通常具有不属于生产的元数据,但我们希望对其进行版本控制,但与我们的干净预发布分支分开.
因此,我们有以下内容:
(Production Init Commit) (official release)
/ /
o-------------------------o [master]
\ /
o------o---------o----o [pre-release]
\ /
o-----O [feature]
\ <-- IS THIS ALLOWED/POSSIBLE/BAD IDEA?
\
o------------O [DEV] (orphan branch)
/
(Initial commit from our sandbox environment)
Run Code Online (Sandbox Code Playgroud) 我正在尝试在Hibernate 4.3.5/JPA2对象中使用orphanRemoval,但它似乎没有像我预期的那样工作.但是,如果我做错了什么,或者这仍然是Hibernate中的错误,我不确定.
鉴于以下关系(为了简洁省略了@Version,getters和setter):
@Entity
public class Provider implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;
private String name;
@OneToMany(orphanRemoval=true,cascade=CascadeType.REMOVE)
@JoinColumn(name="provider_id", referencedColumnName="id")
private List<Contract> contracts;
}
@Entity
public class Contract implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;
private String volume;
@OneToMany(orphanRemoval=true,cascade=CascadeType.REMOVE) // delete any attachments that were previously uploaded with this contract
@JoinTable(name="contract_attachment", joinColumns = @JoinColumn(name = "contract_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "attachment_id", referencedColumnName = "id"))
private …
Run Code Online (Sandbox Code Playgroud) 我所说的孤儿词是指一行中的一个单词。是否可以借助 CSS 来避免任何只有一个单词的行?
例如 SERUM 是一个孤立词:
ECSTASY OF EXISTENCE FIRMING ANTIOXIDANT BODY
SERUM
Run Code Online (Sandbox Code Playgroud)
它应该看起来像这样
ECSTASY OF EXISTENCE FIRMING ANTIOXIDANT
BODY SERUM
Run Code Online (Sandbox Code Playgroud)
我有两个对象形成父子关系,它们具有多对多的关系.按照Hibernate参考手册中的建议,我使用连接表映射了这个:
<class name="Conference" table="conferences">
...
<set name="speakers" table="conference_speakers" cascade="all">
<key column="conference_id"/>
<many-to-many class="Speaker" column="speaker_id"/>
</set>
</class>
<class name="Speaker" table="speakers">
<id name="id" column="id">
<generator class="native"/>
</id>
<property name="firstName"/>
<property name="lastName"/>
</class>
Run Code Online (Sandbox Code Playgroud)
我希望单个演讲者可以与许多不同的会议相关联,而且任何会议不再引用的演讲者都会从speakers
表格中删除(因为没有相关会议的演讲者在我的项目中没有多大意义) ).
但是,我发现,如果我使用cascade="all-delete-orphan"
,那么如果只从其中一个会议中删除与多个会议相关联的扬声器,则Hibernate会尝试删除扬声器实例本身.
下面是一个显示此行为的单元测试:
@Test
public void testRemoveSharedSpeaker() {
int initialCount = countRowsInTable("speakers");
Conference c1 = new Conference("c1");
Conference c2 = new Conference("c2");
Speaker s = new Speaker("John", "Doe");
c1.getSpeakers().add(s);
c2.getSpeakers().add(s);
conferenceDao.saveOrUpdate(c1);
conferenceDao.saveOrUpdate(c2);
flushHibernate();
assertEquals(initialCount + 1, countRowsInTable("speakers"));
assertEquals(2, countRowsInTable("conference_speakers"));
// the …
Run Code Online (Sandbox Code Playgroud) 从python终端,我运行如下命令,以产生一个长时间运行的子进程:
from multiprocessing.process import Process
Process(target=LONG_RUNNING_FUNCTION).start()
Run Code Online (Sandbox Code Playgroud)
这个命令返回,我可以在python终端中做其他事情,但是孩子打印的任何内容仍然会打印到我的python终端会话中.
当我退出终端(使用exit
或CTRL+ D)时,退出命令会挂起.如果我在此挂起期间按CTRL+ C,则终止子进程.
如果我手动终止python终端进程(通过posix kill
命令),子进程将被孤立,并继续运行,其输出可能被丢弃.
如果我运行此代码python -c
,它等待孩子终止,并且CTRL+ C杀死父和子.
当父母被终止时,哪些运行配置的python会杀死孩子?特别是,如果python-mod_wsgi-apache webserver产生子进程然后重新启动,那么这些孩子会被杀死吗?
[顺便说一下,分离终端产生的子进程的正确方法是什么?有没有比以下更优雅的方式:故意在python中创建一个孤儿进程 ]
更新:在apache重新启动时,multiprocessing.Process
由apache下运行的Web服务器生成的python子进程不会被终止.
新父母总是"初始化"还是有某种方法来控制谁成为新的父母?
维基百科似乎表明它总是"初始化".我真的希望事实并非如此.我尝试过setpgid和setsid所能想到的一切,但没有运气.现在,我看到这篇维基百科文章,我需要建议.
在类Unix操作系统中,任何孤立的进程都将立即被特殊的init系统进程采用.此操作称为重新父级并自动发生.尽管从技术上讲,该进程将"init"进程作为其父进程,但它仍称为孤立进程,因为最初创建它的进程不再存在. 取自维基百科
我问的原因是因为我正在制作一个运行许多工作流程的Mac应用程序.我希望这些工作进程在任务管理器的进程层次结构中显示为主进程的子进程.一些工作者作为不同的用户运行,并且在Mac OS XI上需要分叉两次以将权限传递给子进程.因为我"双叉"工作人员目前作为守护人员运行,当与任务管理员一起查看时,我看到工作人员正在将"init"作为他们的父进程.