# 更多 LDAP 操作

> 原文： [https://docs.oracle.com/javase/tutorial/jndi/ldap/rename.html](https://docs.oracle.com/javase/tutorial/jndi/ldap/rename.html)

LDAP 课程的其余部分介绍了 JNDI 如何提供执行某些有趣的 LDAP 操作的能力。

## 重命名对象

使用 [`Context.rename（）`](https://docs.oracle.com/javase/8/docs/api/javax/naming/Context.html#rename-javax.naming.Name-javax.naming.Name-) 重命名目录中的对象。在 [LDAP v2](http://www.ietf.org/rfc/rfc1777.txt) 中，这对应于在同一上下文中重命名条目的“修改 RDN”操作（即重命名兄弟）。在 [LDAP v3](http://www.ietf.org/rfc/rfc2251.txt) 中，这对应于“修改 DN”操作，类似于“修改 RDN”，除了旧条目和新条目不必在同一上下文中。您可以使用 `Context.rename（）`重命名叶子条目或内部节点。 [命名和目录操作](../ops/rename.html)课程中显示的示例将重命名叶条目。以下 [`code`](examples/RenameInterior.java) 将`“ou = NewHires”`的内部节点重命名为`“ou = OldHires”`：

```
ctx.rename("ou=NewHires", "ou=OldHires");

```

* * *

**Note:** The [Oracle Directory Server v5.2](http://www.oracle.com/technetwork/testcontent/index-085178.html) does not support renaming interior nodes. If you run this example, then you will get a [`ContextNotEmptyException`](https://docs.oracle.com/javase/8/docs/api/javax/naming/ContextNotEmptyException.html).

* * *

### 重命名为 DIT 的不同部分

使用 LDAP v3，您可以将条目重命名为 DIT 的其他部分。要使用 `Context.rename（）`执行此操作，必须使用新旧条目的共同祖先上下文。例如，重命名`“cn = C. User，ou = NewHires，o = JNDITutorial”` to `“cn = C. User，ou = People，o = JNDITutorial”`，你必须使用`“o = JNDITutorial”`命名的上下文。以下是 [`an example`](examples/RenameDiffParent.java) ，证明了这一点。如果您尝试针对 LDAP v2 服务器运行此示例，那么您将获得 [`InvalidNameException`](https://docs.oracle.com/javase/8/docs/api/javax/naming/InvalidNameException.html)，因为版本 2 不支持此功能。

```
ctx.rename("cn=C. User, ou=NewHires", "cn=C. User, ou=People");

```

* * *

**Note:** The [Oracle Directory Server v5.2](http://www.oracle.com/technetwork/testcontent/index-085178.html) does not support renaming with different parent nodes. If you run this example by using that server, then you will get a [`OperationNotSupportedException`](https://docs.oracle.com/javase/8/docs/api/javax/naming/OperationNotSupportedException.html) (indicating a "protocol error").

* * *

### 保持旧名称属性

在 LDAP 中，重命名条目时，可以选择将条目的旧 RDN 保留为更新条目的属性。例如，如果您将条目`“cn = C.用户”`重命名为`“cn = Claude User”`，您可以指定是否需要旧的 RDN `“cn = C.用户“`作为属性保存。

要指定在使用 `Context.rename（）`时是否要保留旧名称属性，请使用`“java.naming.ldap.deleteRDN”`环境属性。如果此属性的值为`“true”`（默认值），则删除旧的 RDN。如果其值为`“false”`，则旧 RDN 将保留为更新条目的属性。完整的例子是 [`here`](examples/RenameKeepRDN.java) 。

```
// Set the property to keep RDN
env.put("java.naming.ldap.deleteRDN", "false");

// Create the initial context
DirContext ctx = new InitialDirContext(env);

// Perform the rename
ctx.rename("cn=C. User, ou=NewHires", "cn=Claude User,ou=NewHires");

```